#include "Connection.h"

Connection::Connection(EventLoop *loop, Sock *clientSock)
    : loop_(loop), clientSock_(clientSock)
{
    clientChannel_ = new Channel(loop_, clientSock->getSock());
    clientChannel_->setReadCallBack(std::bind(&Connection::onmessage, this));
    clientChannel_->setCloseCallBack(std::bind(&Connection::closecallback, this));
    clientChannel_->setErrorCallBack(std::bind(&Connection::errorcallback, this));
    clientChannel_->useET();
    clientChannel_->enableReading();
}
Connection::~Connection()
{
    delete clientSock_;
    delete clientChannel_;
}

std::string Connection::getIp() const
{
    return clientSock_->getIp();
}
uint16_t Connection::getPort() const
{
    return clientSock_->getPort();
}

int Connection::getFd() const
{
    // std::cout<<"Connection::getFd() begin"<<std::endl;
    return clientSock_->getSock();
    // std::cout<<"Connection::getFd( end"<<std::endl;
}

void Connection::closecallback()
{
    // printf("client(eventfd=%d) disconnected.\n", getFd());
    // close(getFd()); // 关闭客户端的fd。
    closeCallBack_(this);
}
void Connection::errorcallback()
{
    // printf("client(eventfd=%d) error.\n", getFd());
    // close(getFd()); // 关闭客户端的fd。
    errorCallBack_(this);
}

void Connection::setCloseCallBack(func_t fn)
{
    closeCallBack_ = fn;
}
void Connection::setErrorCallBack(func_t fn)
{
    
    errorCallBack_ = fn;
}

void Connection::onmessage()
{
    char buffer[1024];
    while (true) // 由于使用非阻塞IO，一次读取buffer大小数据，直到全部的数据读取完毕。
    {
        bzero(&buffer, sizeof(buffer));
        ssize_t nread = read(getFd(), buffer, sizeof(buffer));
        if (nread > 0) // 成功的读取到了数据。
        {
            // 把接收到的报文内容原封不动的发回去。
            // printf("recv(eventfd=%d):%s\n", fd_, buffer);
            // send(fd_, buffer, strlen(buffer), 0);

            inputBuffer_.append(buffer,nread);
        }
        else if (nread == -1 && errno == EINTR) // 读取数据的时候被信号中断，继续读取。
        {
            continue;
        }
        else if (nread == -1 && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) // 全部的数据已读取完毕。
        {
            printf("recv(eventfd=%d):%s\n", getFd(), inputBuffer_.data());
            // 假设这里经过运算
            outputBuffer_=inputBuffer_;
            inputBuffer_.clear();
            send(getFd(),outputBuffer_.data(),outputBuffer_.size(),0);
            break;
        }
        else if (nread == 0) // 客户端连接已断开。
        {
            // printf("client(eventfd=%d) disconnected.\n", fd_);
            // close(fd_); // 关闭客户端的fd。
            closecallback();
            break;
        }
        else
        {
        }
    }
}